<?php

/**
 * 分页函数,跳转需要将结果放在<form>里面，只适用于MySQL，因为使用了SELECT SQL_FOUND_ROWS, 
 * 需要的SQL语句中的SELECT后添加SQL_CALC_FOUND_ROWS ，使原来的 
 * SELECT [COL] FROM [TABLE],变为
 * SELECT SQL_CALC_FOUND_ROWS [COL] FROM [TABLE]
 * $pageurl = "index.php?type=1&"; //页面url
 * $page_tip = show_page( $url, $page_size ); //进行分页，嘿嘿
 * 
 * 少于15页：共15页  1 2 3 4 5 [6] 7 8 9 10 11 12 13 14 15
 * 多，在头部：共60页  [1] 2 3 4 5...30 31 32...58 59 60 下一页 [ ] 跳到
 * 多，在中间页：共60页 上一页 1 2 3...41 42 [43] 44 45...58 59 60 下一页 [ ] 跳到
 * 多，在尾部：共60页   上一页 1 2 3...30 31 32...56 57 58 [59] 60  [ ] 跳到
 * 
 * @package include
 * @param String $pageurl 打算分页的url地址
 * @param string $url 分页的页面链接地址
 * @param int $page_size 每页显示的记录数
 * @param string $result : 指定返回的结果是SQL语句里的LIMIT还是要分页
 * @return String or FALSE
 */
function show_page ( $page_size, $result = 'page_tip', $url = '', $with_form = true ) {
	$page_tip = '';   //最终需要返回的分页代码
	
	$page_curr  = isset( $_REQUEST['page'] ) ? $_REQUEST['page'] : 1; //获取页码
	$page_curr = ( $page_curr < 1 ? 1 : $page_curr ); //当前页为负数则设为1
	
	if ( $result == 'limit' ) { //返回当前的LIMIT条件
		$limit_start = ( $page_curr - 1 ) * $page_size;       //查询起始位置
		$limit = "LIMIT $limit_start, $page_size ";      //设置limit条件
		return $limit;
	}

	$sql_num = "SELECT FOUND_ROWS()";               //设置获取总数量的SQL语句
	$rsnum = model::dbuser()->get_one( $sql_num );                        //得到总记录数字数组
	//var_dump( $rsnum ); 
	$result_sum = $rsnum['FOUND_ROWS()'];           //得到查询影响到的总记录和
	//var_dump( $result_sum );exit; 

	$page_sum = ceil( $result_sum / $page_size ); //add by me ，总页数
	$page_curr = ( $page_curr > $page_sum ? $page_sum : $page_curr );
	
	//得到当前页码的文件名
	if( isset( $_GET['page'] ) ) unset( $_GET['page'] );
	$url = "index.php?" . http_build_query( $_GET ); 
	$page_first = "共{$page_sum}页";
	$center = ceil ( ( $page_sum + 2 ) / 2 ); //得到最中间的那一页的页码
	
	if ( $page_curr > 1 ) {   //只要不是在第一页，就显示上一页
		$page_prev = get_a ( $url, 1, 0, null, ( $page_curr - 1 ), 1 ); //上一页
	} else { $page_prev = '上一页'; }
	
	if ( $page_curr < $page_sum ) {  //只要不是最后一页，就显示下一页
		$page_next = get_a ( $url, 1, 0, null, ( $page_curr + 1 ), 2 ); //下一页
	} else { $page_next = '下一页'; }
	
	if ( $page_sum < 15 ) { //总页数少于15页,直接显示所有数字
		$page_tip = implode( ' ', get_a( $url, 1, $page_sum, $page_curr ) );
		return $page_tip;
	} elseif ( $page_curr < 6 ) { //总页数大于15页,但当前页在前5页之内
		if ( $page_curr > 3 ) {
			$tip_head = implode( ' ', get_a( $url, 1, ( $page_curr + 2 ) , $page_curr ) ); //头五页
		} else {
			$tip_head = implode( ' ', get_a( $url, 1, 5, $page_curr ) ); //头五页
		}
		$tip_center = implode( ' ', get_a( $url, ( $center - 1 ), ($center + 1 ) ) ); //得到中间的三页
		$tip_foot = implode( ' ', get_a( $url, ( $page_sum - 2 ), $page_sum ) ); //尾三页
		$page_tip = "$page_first $page_prev $tip_head...$tip_center...$tip_foot $page_next"; //合并咯
		if ( $with_form ) {
			return with_form ( $page_tip, $url );
		} else { return $page_tip; }
	} elseif ( ( $page_curr > 5 ) && $page_curr < ( $page_sum - 4 ) ) {
		//总页数大于15页,当前页在前5页和最后五页以外，也就是在中间
		$tip_head = implode( ' ', get_a( $url, 1, 3 ) );
		$tip_center = implode( ' ', get_a( $url, ( $page_curr - 2 ), ( $page_curr + 2 ), $page_curr ) );
		$tip_foot = implode( ' ', get_a( $url, ( $page_sum - 2 ), $page_sum ) );
		$page_tip = "$page_first $page_prev $tip_head...$tip_center...$tip_foot $page_next";
		if ( $with_form ) {
			return with_form ( $page_tip, $url );
		} else { return $page_tip; }
	} elseif ( $page_curr > ( $page_sum - 5 ) ) {
		//总页数大于15页,当前页最后五页以内时
		$tip_head = implode( ' ', get_a( $url, 1, 3 ) );
		$tip_center = implode( ' ', get_a( $url, ( $center - 1 ), ( $center + 1 ) ) );
		if ( $page_curr < ( $page_sum - 2 ) ) {
			$tip_foot = implode( ' ', get_a( $url, ( $page_curr - 2 ), $page_sum, $page_curr ) );
		} else { $tip_foot = implode( ' ', get_a( $url, ( $page_sum - 4 ), $page_sum, $page_curr ) ); }
		$page_tip = "$page_first $page_prev $tip_head...$tip_center...$tip_foot $page_next";
		if ( $with_form ) { 
			return with_form ( $page_tip, $url );
		} else { return $page_tip; }
	} else {
		return false;
	}
}

/**
 * 得到一个指定或一组指定数字所对应的链接
 * 此函数为上一个函数的配套函数
 * 
 * @author zenk
 * @param string $url ：需要批量生成的url地址，相对或绝对
 * @param int $min : 所需要生成链接的连续的数字的最小值
 * @param int $max : 所需要生成链接的连续的数字的最大值
 * @param $curr_num : 当前所在页的数字，指定该值将指定当前所在页的样式
 * @param mixed $nums : 需要生成链接的数字组或单个
 * @param int $n_or_p : 指定生成上一页或者下一页 0,数字式，1为上一页，2为下一页
 * @param string $curr_style : 当前页的CSS样式名字
 * @return mixed or FALSE
 */
function get_a ( $url, $min = 1, $max = 0, $curr_num = null, $nums = 1, $n_or_p = 0, $curr_style = 'curr' ) {
	$url .= strpos( $url, '?' ) ? '&page=' : '?page=';
	$lit_page = array(); //等待返回的结果
	//指定最大最小值，则返回连续的数字链接数组;
	if ( $max && ( $max > $min ) ) {
		for ( $i = $min; $i <= $max; $i++ ) {
			if ( $i == $curr_num ) {
				//生成当前所在页的样式
				$lit_page[] = "<a href=\"{$url}{$i}\" class=\"{$curr_style}\">[$i]</a>";
			} else {
				$lit_page[] = "<a href=\"{$url}{$i}\" >$i</a>";
			}
		}
		return $lit_page;
	}
	//指定参数为数组，则返回数组结果，其中每一个元素都是一个数字所对应的链接，还可以指定当前页
	if ( is_array( $nums ) ) {
		foreach ( $nums as $num ) {
			if ( is_numeric( $num ) ) {
				if ( $num == $curr_num ) {
					//生成当前所在页的样式
					$lit_page[] = "<a href=\"{$url}{$num}\" class=\"{$curr_style}\">[$num]</a>";
				} else {
					$lit_page[] = "<a href=\"{$url}{$num}\" >$num</a>";
				}
			} else {
				return false;
			}
		}
		return $lit_page;
	} elseif ( is_numeric( $nums ) ) {
		$link = ( $n_or_p == 1 ? '上一页' : ( $n_or_p == 2 ? '下一页' : $nums ) );
		if ( $nums == $curr_num ) {
			//生成当前所在页的样式
			return "<a href=\"{$url}{$nums}\" class=\"{$curr_style}\">[$link]</a>";
		} else {
			return "<a href=\"{$url}{$nums}\" >$link</a>";
		}
	} else { 
		return false;
	}
}

/**
 * 分页函数的辅助函数，为分页函数添加一个表单，使之能提交页码，为了不让一个函数显得过于复杂而做的分离
 */
function with_form ( $content, $url ) {
	$with_form = "<form method=\"POST\" action=\"$url\" name=\"page_form\" >$content
	<input type=\"text\" name=\"page\" size=\"1\" class=\"page_txt\"/>
	<input type=\"submit\" name=\"submit_form\" value=\"跳转\" class=\"page_btn\"/></form>";
	return $with_form;
}